
#pragma once
#include<iostream>
#include<string>
#include<cstdio>
#include<stdarg.h>
#include<ctime>
#include<unistd.h>
#include<sys/types.h>

#define LOG_ERR "log.errorr" 
#define LOG_NORMAL "log.normal" 

//日志是有日志等级的！来表示那些事情重要！那些事情不重要！
#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3//这个的意思是虽然出错了！但是不影响我们后续的运行！
#define FATAL 4 //这个是致命的！意思是不仅仅是出错了！而且出错很严重！


const char* to_levelstr(int level)
{
    switch(level)
    {
        case DEBUG :return "DEBUG";
        case NORMAL :return "NORMAL";
        case WARNING :return "WARNING";
        case ERROR:return "ERROR";
        case FATAL :return "FATAL";
        default: return nullptr;
    }
}


void LogMessage(int level,const char* format,...)//这是一个可变参数列表！
{
    //[日志等级][时间搓/时间][pid][message]——日志格式
    //[WARNING][2023-05-11 18:08:08][123][调用socket失败！]
    va_list start;
    va_start(start,format);//初始化start，让其指向第一个可变参数的地址！
    //此时离可变参数列表最近的就是message
#define NUM 1024
    char logprefix[NUM];
    snprintf(logprefix,sizeof(logprefix),"[%s][%ld][pid:%d]",to_levelstr(level),(long int)time(nullptr),getpid());
    //获取时间有time和gettimeofday和这两个的函数
    //localtime这个可以将时间转化为本地时间

    char logcontent[NUM];
    vsnprintf(logcontent,sizeof(logcontent),format,start);
    std::cout << logprefix << logcontent << std::endl;

    // FILE* log = fopen(LOG_NORMAL,"a");
    // FILE* err = fopen(LOG_ERR,"a");
    // if(log != nullptr && err != nullptr)
    // {
    //     if(level == DEBUG || level ==NORMAL || level ==WARNING)
    //     {
    //         fprintf(log,"%s%s\n",logprefix,logcontent);
    //     }
    //     if(level == FATAL || level == ERROR)
    //     {
    //         fprintf(err, "%s%s\n", logprefix, logcontent);
    //     }
    //     fclose(log);
    //     fclose(err);
    // }

}
